package com.study.kt._02feature

fun main() {
    testInline()
}

/**
 * 内联函数
 */
fun testInline() {
    //调用inline1
    /**
     * 这样做首先将inline1方法入栈，接着又将handle方法入栈，消耗性能
     *
     */
    val res = inline1 { "我是handle方法体" }
    println(res)

    /**
     * 使用inline标注方法inline2，则他是一个内联函数
     * 内敛函数在编译时就会将handle方法添加到自己的方法体，所以只进行一次方法入栈，性能提高，但是相应的代码量多了
     */
    val res2 = inline2 { "我是内联函数体" }
    println(res2)
}

fun <T> inline1(handle: () -> T): T {
    return handle()
}

inline fun <T> inline2(handle: () -> T): T {
    return handle()
}

//定义一个不是内联的函数
// inline2中 handle函数，与该函数的method不能互相传递，因为inline2为内联函数，handle函数也是内联的
// 内联函数在编译时已经变成参数，而method是函数类型所以不能接收handle
//如果想要将handle传递给method，就需要将handle声明为不是内联函数 noinline handle: () -> T
fun <T> noInline(method: () -> T) {

}

// crossinline，添加该标记的内部方法/lambdal不允许非局部返回
// non-local returns 非局部返回（方法嵌套方法/lambda表达式，内部方法的返回值直接作为外部方法的返回值）


